﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FrameworkLib.Facades;
using GestionePolveri2.DAL;
using GestionePolveriLib.BL;
using GestionePolveriLib.Facades.Extensions;
using System.Data.Objects;

namespace GestionePolveriLib.Facades
{
    public class PartiteFacade : FacadeBase<GestionePolveriEntities>
    {
        public PartiteFacade()
        {
            
        }

        public void LoadAsync(BackgroundWorkerCallbackBase.Callback callback)
        {
            this.RunAsync(() => GetReverse3Items(), callback);
        }

        public List<PartitaInfo> Get()
        {
            GestionePolveriEntities m_context = this.GetContext();

            List<PartitaInfo> retValue = null;

            ColoriFacade cf = new ColoriFacade();

            var obj = from x in GetContext().Partite
                      select new PartitaInfo
                      {
                          POS = (from m in m_context.Movimenti where m.IDMovimento == x.IDMovimento select new POS { POSValue = m.POS.Value, DateOfPos = m.DataMovimento}).FirstOrDefault(),
                          FlagConforme = x.FlagConforme,
                          QuantitaVerniciata = x.QuantitaVerniciata,
                          ColoreVerniciato = (from c in m_context.AnagColori
                                              where c.IDColore == x.IDColore
                                              select new Colore
                                              {
                                                  ID = c.IDColore,
                                                  Descrizione = c.Descrizione,
                                                  CodiceColore = c.CodiceColore,
                                                  Note = c.Note,
                                                  Famiglia = (from y in m_context.AnagFamiglie
                                                              where y.IDFamiglia == c.IDFamiglia
                                                              select new FamigliaColore
                                                              {
                                                                  ID = y.IDFamiglia,
                                                                  Descrizione = y.Descrizione
                                                              }).FirstOrDefault()
                                              }).FirstOrDefault(),
                          LatoA = new SpessoreVernice() { Misura1 = (decimal)x.SPA1, Misura2 = (decimal)x.SPA2, Misura3 = (decimal)x.SPA3 },
                          LatoB = new SpessoreVernice() { Misura1 = (decimal)x.SPB1, Misura2 = (decimal)x.SPB2, Misura3 = (decimal)x.SPB3 }

                      };


            if (obj.Any())
            {
                retValue = obj.ToList();
            }

            return retValue;
        }

        public PartitaInfo Get(long idMovimento)
        {
            GestionePolveriEntities m_context = this.GetContext();

            PartitaInfo retValue = null;

            ColoriFacade cf = new ColoriFacade();

            var obj = from x in GetContext().Partite
                      where x.IDMovimento == idMovimento
                      select new PartitaInfo
                      {
                          POS = (from m in m_context.Movimenti where m.IDMovimento == x.IDMovimento select new POS { POSValue = m.POS.Value, DateOfPos = m.DataMovimento }).FirstOrDefault(),
                          FlagConforme = x.FlagConforme,
                          QuantitaVerniciata = x.QuantitaVerniciata,
                          ColoreVerniciato = (from c in m_context.AnagColori
                                              where c.IDColore == x.IDColore
                                              select new Colore
                                              {
                                                  ID = c.IDColore,
                                                  Descrizione = c.Descrizione,
                                                  CodiceColore = c.CodiceColore,
                                                  Note = c.Note,
                                                  Famiglia = (from y in m_context.AnagFamiglie
                                                              where y.IDFamiglia == c.IDFamiglia
                                                              select new FamigliaColore
                                                              {
                                                                  ID = y.IDFamiglia,
                                                                  Descrizione = y.Descrizione
                                                              }).FirstOrDefault()
                                              }).FirstOrDefault(),
                          LatoA = new SpessoreVernice() { Misura1 = (decimal)x.SPA1, Misura2 = (decimal)x.SPA2, Misura3 = (decimal)x.SPA3 },
                          LatoB = new SpessoreVernice() { Misura1 = (decimal)x.SPB1, Misura2 = (decimal)x.SPB2, Misura3 = (decimal)x.SPB3 }

                      };


            if (obj.Any())
            {
                retValue = obj.FirstOrDefault();
            }

            return retValue;
        }

        public PartitaInfo GetByMovimento(long idMovimento)
        {
            GestionePolveriEntities m_context = this.GetContext();

            PartitaInfo retValue = null;

            ColoriFacade cf = new ColoriFacade();

            var obj = from x in GetContext().Partite
                      where x.IDMovimento == idMovimento
                      select new PartitaInfo
                      {
                          FlagConforme = x.FlagConforme,
                          QuantitaVerniciata = x.QuantitaVerniciata,
                          ColoreVerniciato = (from c in m_context.AnagColori
                                              where c.IDColore == x.IDColore
                                              select new Colore
                                              {
                                                  ID = c.IDColore,
                                                  Descrizione = c.Descrizione,
                                                  CodiceColore = c.CodiceColore,
                                                  Note = c.Note,
                                                  Famiglia = (from y in m_context.AnagFamiglie
                                                              where y.IDFamiglia == c.IDFamiglia
                                                              select new FamigliaColore
                                                              {
                                                                  ID = y.IDFamiglia,
                                                                  Descrizione = y.Descrizione
                                                              }).FirstOrDefault()
                                              }).FirstOrDefault(),
                          LatoA = new SpessoreVernice() { Misura1 = (decimal)x.SPA1, Misura2 = (decimal)x.SPA2, Misura3 = (decimal)x.SPA3 },
                          LatoB = new SpessoreVernice() { Misura1 = (decimal)x.SPB1, Misura2 = (decimal)x.SPB2, Misura3 = (decimal)x.SPB3 }

                      };


            if (obj.Any())
            {
                retValue = obj.FirstOrDefault();
            }

            return retValue;
        }

        public List<PartitaInfo> GetReverse3Items(string turno, string impianto, DateTime dataMovimento)
        {
            GestionePolveriEntities m_context = this.GetContext();

            List<PartitaInfo> retValue = null;

            ColoriFacade cf = new ColoriFacade();

            var obj = (from x in GetContext().Partite
                       where EntityFunctions.TruncateTime(x.Movimenti.DataMovimento) == EntityFunctions.TruncateTime(dataMovimento) &&
                            x.Movimenti.Turni.Descrizione == turno &&
                            x.Movimenti.Impianti.Impianto == impianto
                      orderby EntityFunctions.TruncateTime(x.Movimenti.DataMovimento) descending, x.Movimenti.POS descending
                      select new PartitaInfo
                      {
                          POS = (from m in m_context.Movimenti where m.IDMovimento == x.IDMovimento select new POS { POSValue = m.POS.Value, DateOfPos = m.DataMovimento }).FirstOrDefault(),
                          FlagConforme = x.FlagConforme,
                          QuantitaVerniciata = x.QuantitaVerniciata,
                          ColoreVerniciato = (from c in m_context.AnagColori
                                              where c.IDColore == x.IDColore
                                              select new Colore
                                              {
                                                  ID = c.IDColore,
                                                  Descrizione = c.Descrizione,
                                                  CodiceColore = c.CodiceColore,
                                                  Note = c.Note,
                                                  Famiglia = (from y in m_context.AnagFamiglie
                                                              where y.IDFamiglia == c.IDFamiglia
                                                              select new FamigliaColore
                                                              {
                                                                  ID = y.IDFamiglia,
                                                                  Descrizione = y.Descrizione
                                                              }).FirstOrDefault()
                                              }).FirstOrDefault(),
                          LatoA = new SpessoreVernice() { Misura1 = (decimal)x.SPA1, Misura2 = (decimal)x.SPA2, Misura3 = (decimal)x.SPA3 },
                          LatoB = new SpessoreVernice() { Misura1 = (decimal)x.SPB1, Misura2 = (decimal)x.SPB2, Misura3 = (decimal)x.SPB3 },
                          Note = x.Movimenti.Note,
                          Operatore = (from o in m_context.aspnet_Users where o.UserId == x.Movimenti.IDOperatore select o).FirstOrDefault().UserName
                      }).Take(3);


            if (obj.Any())
            {
                retValue = obj.ToList();
            }

            return retValue;
        }

        public List<PartitaInfo> GetReverse3Items(string turno, string impianto)
        {
            GestionePolveriEntities m_context = this.GetContext();

            List<PartitaInfo> retValue = null;

            ColoriFacade cf = new ColoriFacade();

            var obj = (from x in GetContext().Partite
                       where EntityFunctions.TruncateTime(x.Movimenti.DataMovimento) == EntityFunctions.TruncateTime(DateTime.Now) &&
                            x.Movimenti.Turni.Descrizione == turno &&
                            x.Movimenti.Impianti.Impianto == impianto
                       orderby EntityFunctions.TruncateTime(x.Movimenti.DataMovimento) descending, x.Movimenti.POS descending
                       select new PartitaInfo
                       {
                           POS = (from m in m_context.Movimenti where m.IDMovimento == x.IDMovimento select new POS { POSValue = m.POS.Value, DateOfPos = m.DataMovimento }).FirstOrDefault(),
                           FlagConforme = x.FlagConforme,
                           QuantitaVerniciata = x.QuantitaVerniciata,
                           ColoreVerniciato = (from c in m_context.AnagColori
                                               where c.IDColore == x.IDColore
                                               select new Colore
                                               {
                                                   ID = c.IDColore,
                                                   Descrizione = c.Descrizione,
                                                   CodiceColore = c.CodiceColore,
                                                   Note = c.Note,
                                                   Famiglia = (from y in m_context.AnagFamiglie
                                                               where y.IDFamiglia == c.IDFamiglia
                                                               select new FamigliaColore
                                                               {
                                                                   ID = y.IDFamiglia,
                                                                   Descrizione = y.Descrizione
                                                               }).FirstOrDefault()
                                               }).FirstOrDefault(),
                           LatoA = new SpessoreVernice() { Misura1 = (decimal)x.SPA1, Misura2 = (decimal)x.SPA2, Misura3 = (decimal)x.SPA3 },
                           LatoB = new SpessoreVernice() { Misura1 = (decimal)x.SPB1, Misura2 = (decimal)x.SPB2, Misura3 = (decimal)x.SPB3 }
                       }).Take(3);


            if (obj.Any())
            {
                retValue = obj.ToList();
            }

            return retValue;
        }

        public List<PartitaInfo> GetReverse3Items()
        {
            GestionePolveriEntities m_context = this.GetContext();

            List<PartitaInfo> retValue = null;

            ColoriFacade cf = new ColoriFacade();

            var obj = (from x in GetContext().Partite
                       where EntityFunctions.TruncateTime(x.Movimenti.DataMovimento) == EntityFunctions.TruncateTime(DateTime.Now)
                       orderby EntityFunctions.TruncateTime(x.Movimenti.DataMovimento) descending, x.Movimenti.POS descending
                       select new PartitaInfo
                       {
                           POS = (from m in m_context.Movimenti where m.IDMovimento == x.IDMovimento select new POS { POSValue = m.POS.Value, DateOfPos = m.DataMovimento }).FirstOrDefault(),
                           FlagConforme = x.FlagConforme,
                           QuantitaVerniciata = x.QuantitaVerniciata,
                           ColoreVerniciato = (from c in m_context.AnagColori
                                               where c.IDColore == x.IDColore
                                               select new Colore
                                               {
                                                   ID = c.IDColore,
                                                   Descrizione = c.Descrizione,
                                                   CodiceColore = c.CodiceColore,
                                                   Note = c.Note,
                                                   Famiglia = (from y in m_context.AnagFamiglie
                                                               where y.IDFamiglia == c.IDFamiglia
                                                               select new FamigliaColore
                                                               {
                                                                   ID = y.IDFamiglia,
                                                                   Descrizione = y.Descrizione
                                                               }).FirstOrDefault()
                                               }).FirstOrDefault(),
                           LatoA = new SpessoreVernice() { Misura1 = (decimal)x.SPA1, Misura2 = (decimal)x.SPA2, Misura3 = (decimal)x.SPA3 },
                           LatoB = new SpessoreVernice() { Misura1 = (decimal)x.SPB1, Misura2 = (decimal)x.SPB2, Misura3 = (decimal)x.SPB3 }
                       }).Take(3);


            if (obj.Any())
            {
                retValue = obj.ToList();
            }

            return retValue;
        }

        public bool Add(PartitaInfo partita)
        {
            bool retValue = false;

            try
            {
                Partite p = new Partite();
                p.SPA1 = (partita.LatoA != null ? partita.LatoA.Misura1 : null); //Convert.ToDecimal(null));
                p.SPA2 = (partita.LatoA != null ? partita.LatoA.Misura2 : null); //Convert.ToDecimal(null));
                p.SPA3 = (partita.LatoA != null ? partita.LatoA.Misura3 : null); //Convert.ToDecimal(null));
                p.SPB1 = (partita.LatoB != null ? partita.LatoB.Misura1 : null); //Convert.ToDecimal(null));
                p.SPB2 = (partita.LatoB != null ? partita.LatoB.Misura2 : null); //Convert.ToDecimal(null));
                p.SPB3 = (partita.LatoB != null ? partita.LatoB.Misura3 : null); //Convert.ToDecimal(null));
                p.FlagConforme = partita.FlagConforme;
                p.QuantitaVerniciata = partita.QuantitaVerniciata;
                p.IDColore = partita.ColoreVerniciato.ID;
                p.IDMovimento = partita.Movimento.IDMovimento;
                
                this.GetContext().Partite.AddObject(p);
                this.GetContext().SaveChanges();

                retValue = true;
            }
            catch (Exception ex)
            {
                throw;
            }

            return retValue;
        }

        public bool Modify(PartitaInfo partita)
        {
            bool retValue = false;

            try
            {
                var obj = from x in this.GetContext().Partite
                          where x.IDMovimento == partita.Movimento.IDMovimento
                          select x;

                if (obj.Any())
                {
                    Partite p = obj.FirstOrDefault();

                    p.SPA1 = (partita.LatoA != null ? partita.LatoA.Misura1 : Convert.ToDecimal(null));
                    p.SPA2 = (partita.LatoA != null ? partita.LatoA.Misura2 : Convert.ToDecimal(null));
                    p.SPA3 = (partita.LatoA != null ? partita.LatoA.Misura3 : Convert.ToDecimal(null));
                    p.SPB1 = (partita.LatoB != null ? partita.LatoB.Misura1 : Convert.ToDecimal(null));
                    p.SPB2 = (partita.LatoB != null ? partita.LatoB.Misura2 : Convert.ToDecimal(null));
                    p.SPB3 = (partita.LatoB != null ? partita.LatoB.Misura3 : Convert.ToDecimal(null));
                    p.FlagConforme = partita.FlagConforme;
                    p.QuantitaVerniciata = partita.QuantitaVerniciata;
                    p.IDColore = partita.ColoreVerniciato.ID;

                    this.GetContext().SaveChanges();
                    retValue = true;
                }
            }
            catch (Exception ex)
            {
                throw;
            }

            return retValue;
        }

        public bool AddOrModify(PartitaInfo partita)
        {
            bool retValue = false;

            try
            {
                var obj = from x in this.GetContext().Partite
                          where x.IDMovimento == partita.Movimento.IDMovimento
                          select x;

                if (obj.Any())
                {
                    retValue = this.Modify(partita);
                }
                else
                {
                    retValue = this.Add(partita);
                }
            }
            catch (Exception ex)
            {
                throw;
            }

            return retValue;
        }

        public bool Delete(PartitaInfo partita)
        {
            bool retValue = false;

            try
            {
                var obj = from x in this.GetContext().Partite where x.IDMovimento == partita.Movimento.IDMovimento select x;

                if (obj.Any())
                {
                    this.GetContext().Partite.DeleteObject(obj.FirstOrDefault());
                    this.GetContext().SaveChanges();

                    retValue = true;
                }
            }
            catch (Exception ex)
            {
                throw;
            }

            return retValue;
        }

        public bool Delete(int idColore)
        {
            bool retValue = false;

            try
            {
                var obj = from x in this.GetContext().Partite where x.IDColore == idColore select x;

                if (obj.Any())
                {
                    List<Partite> m_partite = obj.ToList();

                    foreach (Partite p in m_partite)
                    {
                        this.GetContext().Partite.DeleteObject(p);
                    }

                    this.GetContext().SaveChanges();

                    retValue = true;
                }
            }
            catch (Exception ex)
            {
                throw;
            }

            return retValue;
        }
    }
}
